home *** CD-ROM | disk | FTP | other *** search
- /*
- * (C) 1992 SixxHeads Software
- * (C) 1992 Berkeley Systems Inc.
- *
- * This code is freely distributable, but credit must be given in any
- * derivative work.
- *
- * <Revision History>
- * 04/28/92 smz Created.
- */
-
- #include <FinderStuff.h>
-
- typedef struct {
- short visible;
- short count;
- short unkown0;
- short menuID;
- short unkown1;
- short unkown2;
- unsigned char title[];
- /* perItem array */
- } *fMenuPtr, **fMenuHandle;
-
- typedef struct {
- unsigned long aEvt;
- char unknown0;
- char unknown1;
- char cmdKey;
- char unused;
- unsigned char itemText[];
- } *perItemPtr;
-
- fMenuHandle hMenu;
-
- static short UseFinderResfile(void)
- {
- short vRefNum;
- long dirID;
-
- if (FindFolder(kOnSystemDisk, kSystemFolderType, true, &vRefNum, &dirID) != noErr) {
- #ifdef DEBUG
- DebugStr("\pcan't locate system folder!");
- #endif
- return -1;
- }
- return HOpenResFile(vRefNum, dirID, FinderName, fsRdPerm);
- }
-
- static Boolean TryFindItem(fMenuHandle hfmnu, unsigned long aeID, unsigned long *cmdItem)
- {
- reg fMenuPtr p = *hfmnu;
- reg unsigned char *t;
- reg perItemPtr item;
- short ctItems = p->count;
- short i;
-
- *cmdItem = (((long) (p->menuID - 0x3e3)) << 16);
-
- t = p->title;
-
- for (i = 0; i < ctItems; i++) {
- if ((*t & 0x01) == 0) /* even, pad */
- t += *t + 2;
- else
- t += *t + 1;
- item = (perItemPtr) t;
- if (item->aEvt == aeID) {
- *cmdItem |= (i + 1);
- return true;
- }
- t = item->itemText;
- }
- return false;
- }
-
- void GetFinderItem(unsigned long aeID, short hintID, unsigned long *cmdItem)
- {
- short ctResources;
- fMenuHandle hfmnu;
- short i;
- short finderRefNum = UseFinderResfile();
-
- if (finderRefNum == 0) {
- *cmdItem = 0;
- return;
- }
- UseResFile(finderRefNum);
-
- /* try to use the hint item first */
- if (hintID != -1) {
- hfmnu = (fMenuHandle) GetResource('fmnu', hintID);
- if (hfmnu == nil) {
- #ifdef DEBUG
- DebugStr("\pCouldn't get 'fmnu' resource #%d!");
- #endif
- } else
- if (TryFindItem(hfmnu, aeID, cmdItem))
- goto exit;
- }
-
- ctResources = CountResources('fmnu');
-
- for (i = 1; i <= ctResources; i++) {
- hfmnu = (fMenuHandle) GetIndResource('fmnu', i);
- if (hfmnu == nil) {
- #ifdef DEBUG
- DebugStr("Couldn't get 'fmnu' resource!");
- #endif
- break;
- }
- if (TryFindItem(hfmnu, aeID, cmdItem))
- goto exit;
- }
-
- *cmdItem = 0; /* not found */
-
- exit:
- CloseResFile(finderRefNum);
- }
-
-